import requests
import json
import time

###
browser_config = {

}
###

# 官方文档地址
# https://doc2.bitbrowser.cn/jiekou/ben-di-fu-wu-zhi-nan.html

# 此demo仅作为参考使用，以下使用的指纹参数仅是部分参数，完整参数请参考文档
url = "http://127.0.0.1:54868"
headers = {'Content-Type': 'application/json'}
def createBrowser(group_id,host,port,account,password):  # 创建或者更新窗口，指纹参数 browserFingerPrint 如没有特定需求，只需要指定下内核即可，如果需要更详细的参数，请参考文档
    json_data = {
        "groupId": group_id,
        "proxyMethod": 2,
        "proxyType": "socks5",
        "host": host,
        "port": port,
        "proxyUserName": account,
        "proxyPassword": password,
        "workbench": "disable",
        "stopWhileNetError": True,  # 网络不通停止打开，默认 false
        "credentialsEnableService": True,  # 禁止保存密码弹窗，默认 false
        "disableTranslatePopup": True,  # 禁止翻译弹窗 默认 false
        "disableNotifications": True,  # 禁止通知弹窗 默认 false
        # 指纹对象，需要随机的值，不填即可，如果需要所有指纹都随机，则只传入 browserFingerPrint: {} 空对象即可
        "browserFingerPrint": {
            "coreProduct": "chrome",  # 内核，chrome | firefox，默认chrome，需要火狐内核时，填firefox
            "coreVersion": "130",  # chrome 内核默认 130，firefox内核默认 128，所有内核版本，参考客户端界面内可选值
            "ostype": "PC",  # 操作系统平台 PC | Android | IOS
            "os": "Win32",  # navigator.platform值，严格与操作系统一一对应
            "osVersion": "",  # 操作系统版本，不填时，按照os随机
            "version": "130",  # 浏览器版本，不填则随机，建议与coreVersion版本保持一致
            # 以下指纹如无特殊需求，不建议修改，只传入上方几个指纹字段即可
            "userAgent": "",  # ua，不填则自动生成
            "isIpCreateTimeZone": True,  # 基于IP生成对应的时区
            "timeZone": "",  # 时区，isIpCreateTimeZone 为false时，参考附录中的时区列表
            "timeZoneOffset": 0,  # isIpCreateTimeZone 为false时设置，时区偏移量

            "webRTC": "1",  # webrtc 0 => 替换, 1 => 允许, 2 => 禁止, 3 => 隐私

            "ignoreHttpsErrors": False,  # 忽略https证书错误，true, false
            "position": "1",  # 地理位置 0 => 询问, 1 => 允许, 2 => 禁止
            "isIpCreatePosition": True,  # 是否基于IP生成对应的地理位置
            "lat": "",  # 经度 isIpCreatePosition 为false时设置
            "lng": "",  # 纬度 isIpCreatePosition 为false时设置
            "precisionData": "",  # 精度米 isIpCreatePosition 为false时设置
            "isIpCreateLanguage": True,  # 是否基于IP生成对应国家的浏览器语言
            "languages": "",  # isIpCreateLanguage 为false时设置，值参考附录

            "isIpCreateDisplayLanguage": True,  # 是否基于IP生成对应国家的浏览器界面语言

            "displayLanguages": "",  # isIpCreateDisplayLanguage 为false时设置，默认为空，即跟随系统，值参考附录
            "openWidth": 1280,  # 窗口宽度，只是设置窗口打开时的尺寸，与指纹无关
            "openHeight": 720,  # 窗口高度，只是设置窗口打开时的尺寸，与指纹无关
            "resolutionType": "0",  # 分辨率类型 0 => 跟随电脑, 1 => 自定义，默认建议跟随电脑
            "resolution": "1920 x 1080",  # 自定义分辨率时，具体值
            "windowSizeLimit": True,  # 分辨率类型为自定义，且ostype为PC时，此项有效
            "devicePixelRatio": 1,  # 显示缩放比例，默认1
            "fontType": "2",  # 字体生成类型 0 => 系统默认 | 1 => 自定义
            "font": "",  # 自定义或随机匹配时，设置的字体值
            "canvas": "0",  # canvas 0随机｜1关闭
            "webGL": "0",  # webGL图像，0随机｜1关闭
            "webGLMeta": "0",  # webgl元
        }
    }

    res = requests.post(f"{url}/browser/update",
                        data=json.dumps(json_data), headers=headers).json()
    bit_browser_id = res['data']['id']
    print(bit_browser_id)
    print(res)
    return bit_browser_id


def updateBrowser(id,host,port,account,password):  # 更新窗口，支持批量更新和按需更新，ids 传入数组，单独更新只传一个id即可，只传入需要修改的字段即可，比如修改备注，具体字段请参考文档，browserFingerPrint指纹对象不修改，则无需传入
    json_data = {
        "ids": [f'{id}'],
        'name': 'google',  # 窗口名称
        'remark': '',  # 备注
        'proxyMethod': 2,  # 代理方式 2自定义 3 提取IP
        # 代理类型  ['noproxy', 'http', 'https', 'socks5', 'ssh']
        'proxyType': 'socks5',
        'host': host,  # 代理主机
        'port': port,  # 代理端口
        'proxyUserName': account,  # 代理账号
        'proxyPassword': password,
        "browserFingerPrint": {  # 指纹对象
            'coreVersion': '126'  # 内核版本，注意，win7/win8/winserver 2012 已经不支持112及以上内核了，无法打开
        }
    }
    res = requests.post(f"{url}/browser/update/partial",
                        data=json.dumps(json_data), headers=headers).json()
    print(res)


def openBrowser(id):  # 直接指定ID打开窗口，也可以使用 createBrowser 方法返回的ID
    json_data = {"id": f'{id}'}
    res = requests.post(f"{url}/browser/open",
                        data=json.dumps(json_data), headers=headers,).json()
    return res


def closeBrowser(id):  # 关闭窗口
    json_data = {'id': f'{id}'}
    requests.post(f"{url}/browser/close",
                  data=json.dumps(json_data), headers=headers).json()


def deleteBrowser(id):  # 删除窗口
    json_data = {'id': f'{id}'}
    print(requests.post(f"{url}/browser/delete",
          data=json.dumps(json_data), headers=headers).json())

def clear_browser(id):
    json_data = {'ids': [f'{id}']}
    print(requests.post(f"{url}/cache/clear",
                        data=json.dumps(json_data), headers=headers).json())


# /browser/cookies/clear
def clear_browser_cookie(id):
    json_data = {'browserId': f'{id}'}
    print(requests.post(f"{url}/browser/cookies/clear",
                        data=json.dumps(json_data), headers=headers).json())

if __name__ == '__main__':
    browser_id = createBrowser("2c9bc058939b87300193a0aa99651fbc","as.foxyip.com","7778","a123_custom_zone_IN_sid_43984524_time_10","lei31400")
    openBrowser(browser_id)

    time.sleep(10)  # 等待10秒自动关闭窗口

    closeBrowser(browser_id)

    time.sleep(10)  # 等待10秒自动删掉窗口

    deleteBrowser(browser_id)
